#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <cstdlib>
#include <sys/wait.h>
// bool unblock = false;
// void handle(int sig)
// {
//     std::cout<<"收到了信号："<<sig<<std::endl;
//     int i=0;
//     while(true)
//     {
//         sigset_t pending;
//         sigpending(&pending);
//         for(int i=31;i>=1;i--)
//         {
//             if(sigismember(&pending,i))
//                 std::cout<<1;
//             else 
//                 std::cout<<0;
//         }
//         if(i==20)
//         {
//             unblock=true;
//             break;
//         }
//         i++;
//         std::cout<<std::endl;
//         sleep(1);
//     }

//     exit(0);
// }

// int main()
// {
//     struct sigaction act,oact;
//     act.sa_handler=handle;
//     sigemptyset(&act.sa_mask);
//     sigaddset(&act.sa_mask,3);
//     sigaddset(&act.sa_mask,4);
//     act.sa_flags=0;
//     sigaction(SIGINT,&act,&oact);

//     sigprocmask(SIG_UNBLOCK, &act.sa_mask, NULL);
//     // sigaddset(&act,)
    
    
//     while(true)
//     {
//         std::cout<<"hello world:"<<getpid()<<std::endl;
//         sleep(1);
//         if(unblock==true)
//         {
//             sigset_t unblock_set;
//             sigemptyset(&unblock_set);
//             sigaddset(&unblock_set, 3);
//             sigaddset(&unblock_set, 4);

//             sigprocmask(SIG_UNBLOCK, &unblock_set, NULL); // 解除屏蔽
//             std::cout << "已解除对 SIGUSR1 和 SIGUSR2 的屏蔽" << std::endl;

//             unblock = false; // 重置标志
//             break;
//         }

//     }
//     sigset_t pending;
//     sigpending(&pending);
//     for(int i=31;i>=1;i--)
//     {
//         if(sigismember(&pending,i))
//             std::cout<<1;
//         else 
//             std::cout<<0;
//     }
// }

// volatile int flag = 0;

// void handler(int signu)
// {
//     std::cout << "更改全局变量, " << flag << "-> 1" << std::endl;
//     flag = 1;
// }

// int main()
// {
//     signal(2, handler);

//     while(!flag);
//     std::cout << "process quit normal!" << std::endl;
//     // return 0;
// }

void handle(int sig)
{
    // waitpid(-1, nullptr, 0);
    // std::cout << " father get a signal:" << sig <<std::endl;
    while(true)
    {
        pid_t id = waitpid(-1, nullptr, WNOHANG);
        if(id == 0)
        {
            break;
        }
        else
        {
            std::cout << "waitpid error" << std::endl;
            break;
        }
    }
}

int main()
{
    signal(SIGCHLD, handle);
    for(int i = 0; i < 10; i++)
    {
        pid_t id = fork();
        if (id == 0)
        {
            sleep(3);
            std::cout << "I am child, exit" << std::endl;
            exit(3);
            if(i <= 6) exit(3);
            else pause();
        }
    }

    while (true)
    {
        std::cout << "I am fater, exit" << std::endl;
        sleep(1);
    }

    return 0;
}